#ifndef BOLA_H
#define BOLA_H

#include "arista.h"
#include "vector2d.h"
#include "materialfisico.h"
#include "recta2d.h"
#include "ente.h"

class Bola : public Ente
{
public:
    Bola();
    ~Bola();
    Bola(const Punto2d& p, double radio);
    Bola(double x, double y, double radio);
    QString toString();
    QString getNombre();
    void setNombre(QString nombre);
    Vector2d getVelocidad();
    void setVelocidad(Vector2d velocidad);
    bool haCompletadoMovimiento();
    Vector2d getVectorDesplazamiento();
    Punto2d getPosicion();
    void setPosicion(Punto2d posicion);
    void setPosicion(double x, double y);
    void guardarPosicionAnterior();
    bool prepararMovimiento();
    void finalizarMovimiento();
    void mover();
    void deshacerMovimiento();
    double getRadio();
    void setRadio(double radio);
    MaterialFisico getMaterial();
    void setMaterial(const MaterialFisico& material);
    bool contiene(Punto2d p);
    bool permiteIntrusion();
    bool permiteTraspasar();
    void aplicarFuerza(const Vector2d& fuerza);
    void aplicarAceleracion(const Vector2d& aceleracion);
    double getMasa();
    void setProporcionDesplazamientoPendiente(double proporcion);
    double getProporcionDesplazamientoPendiente();
    Vector2d getFuerzaCinetica();
    Vector2d calcularFuerzaPlanoInclinado(Ente* ente);
    Vector2d fuerzaPlanoInclinado(Bola* otraBola);
    Vector2d fuerzaPlanoInclinado(Arista* arista);
    Vector2d fuerzaPlanoInclinado(const Recta2d& rectaPlanoInclinado);
    Vector2d fuerzaPlanoInclinado(const Punto2d& p1);
    double calcularSeparacion(Ente* ente);
    double calcularSeparacionConBola(Bola* otraBola);
    double calcularSeparacionConArista(Arista* arista);
    bool ocupaEspacioComun(Ente* ente);

private:
    QString nombre;
    Punto2d posicion;
    Punto2d posicionAnterior;
    double radio;
    Vector2d velocidad;
    MaterialFisico material;
    Vector2d fuerzasAplicadas;
    double proporcionDesplazamientoPendiente;
};

#endif // BOLA_H
